package start.spring.basic.util.common;

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.UUID;

/**
 * ****************************************************************************
 * 字符串操作工具类
 *
 * @author(作者)：xuyongyun	
 * @author(复审人)：	xu 2016-5-10
 * @version(版本)1.0
 * @since 1.0
 ******************************************************************************
 */

public class StringUtil {
	
	private static char[] CH_HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
        		'9', 'A', 'B', 'C', 'D', 'E', 'F'};
	
	private static final String NULLVALUE = "null";

	/**
	 * 判断是不是空白字符串
	 * @param src 待处理字符串
	 * @return 空白时返回true，非空白时返回false
	 * @since           1.0
	 */
	public static boolean isEmpty(String src){
		boolean nullValue = (src==null||src.trim().length()==0||src.trim().equalsIgnoreCase(NULLVALUE));
		if(nullValue){
			return true;
		}else{
			return false;
		}
	}
	
	/**
	 * 处理字符串两端空白
	 * @param src 待处理字符串
	 * @param defaultValue 字符串空白时默认返回值
	 * @return src空白时返回defaultValue，非空白时进行左右的空白处理
	 * @since           1.0
	 */
	public static String trim(String src,String defaultValue){
		if(isEmpty(src)){
			return defaultValue;
		}else{
			return src.trim();
		}
	}
	
	/**
	 * 处理空String对象
	 * @param object 待处理对象
	 * @param defaultValue 字符串空白时默认返回值
	 * @return src空白时返回defaultValue，非空白时进行左右的空白处理
	 * @since           1.0
	 */
	public static String trimObject(Object object,String defaultValue){
		if(object==null){
			return defaultValue;
		}else{
			return trim(String.valueOf(object),defaultValue);
		}
		
	}
	
	/**
	 * 处理字符串中间的回车换行及两端的空白
	 *	
	 * @param src
	 * @return
	 * @since           1.0
	 */
	public static String trimEnter(String src){
		if(!isEmpty(src)){
			src = trim(src,"");
			src = src.replaceAll("\r", "");
			src = src.replaceAll("\n", "");
		}
		return src;
	}
	
	/**
     * 将字节数组转为十六进制字符串
     *
     * @param bytes
     * @return 返回16进制字符串
     */
    public static String byteArrayToHex(byte[] bytes) {
        // 一个字节占8位，一个十六进制字符占4位；十六进制字符数组的长度为字节数组长度的两倍
        char[] chars = new char[bytes.length * 2];
        int index = 0;
        for (byte b : bytes) {
            // 取字节的高4位
            chars[index++] = CH_HEX[b >>> 4 & 0xf];
            // 取字节的低4位
            chars[index++] = CH_HEX[b & 0xf];
        }
        return new String(chars);
    }
    
    public static byte[] hexToBytes(String src) {  
    	int m = 0, n = 0;  
    	int l = src.length() / 2; 
    	byte[] ret = new byte[l];  
    	for (int i = 0; i < l; i++) {  
    		m = i * 2 + 1;  
    	    n = m + 1;  
    	    ret[i] = uniteBytes(src.substring(i * 2, m), src.substring(m, n));  
    	}  
    	return ret;  
    }
    
    private static byte uniteBytes(String src0, String src1) {
    	byte b0 = Byte.decode("0x" + src0).byteValue();
    	b0 = (byte) (b0 << 4);  
    	byte b1 = Byte.decode("0x" + src1).byteValue();  
    	byte ret = (byte) (b0 | b1);  
    	return ret;  
    }
    
    public static String getUuid() {  
        UUID uuid = UUID.randomUUID();
        return uuid.toString().replaceAll("-", "");
    }
   
	/**
	 * 转换带小数点的数字为指定格式的字符串
	 * @param money
	 * @param format  格式内容，类似于#0.00， #0.00000000
	 * @return
	 */
	public static String formatBigDecimal(BigDecimal money, String format) {
		DecimalFormat df = new DecimalFormat(format);
		String nums = df.format(money);
		return nums;
	}

	/**
	 * 中文汉字获取首字母
	 * @param name
	 * @return
	 */
	public static String toPinyin(String name){
		char[] charArray = name.toCharArray();
		StringBuilder pinyin = new StringBuilder();
		HanyuPinyinOutputFormat defaultFormat = new HanyuPinyinOutputFormat();
		// 设置大小写格式
		defaultFormat.setCaseType(HanyuPinyinCaseType.UPPERCASE);
		// 设置声调格式：
		defaultFormat.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
		for (int i = 0; i < charArray.length; i++) {
			//匹配中文,非中文转换会转换成null
			if (Character.toString(charArray[i]).matches("[\\u4E00-\\u9FA5]+")) {
				String[] hanyuPinyinStringArray = new String[0];
				try {
					hanyuPinyinStringArray = PinyinHelper.toHanyuPinyinStringArray(charArray[i], defaultFormat);
				} catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) {
					badHanyuPinyinOutputFormatCombination.printStackTrace();
				}
				if (hanyuPinyinStringArray != null) {
					pinyin.append(hanyuPinyinStringArray[0].charAt(0));
				}
			}
		}
		return pinyin.toString();
	}
	
}
